# 不修改函数代码的情况下 为函数增加新的功能 -> 装饰器
# 参考猴子补丁

# 前情提要:函数名只是一个对象，和普通对象一样，这个对象可以引用其他函数的代码
"""
装饰器的使用前提
1.存在闭包(用于扩展新功能)
2.待扩展的普通函数(目的就是不改变改函数,还增加新功能)
格式
@闭包外层函数xxx
def func_xxx():
    ....
"""
# 需求给每一种函数都添加一个相同的新功能
# 而且得遵从 开闭原则 不能修改其内容
def f1():
    print('f1')
def f2():
    print('f2')
def f3():
    print('f3')
def f4():
    print('f4')
f1()
f2()
f3()
f4()

# 装饰器
def w1(func):
    def inner():
        print("增加的新内容")
        func()
    return inner
"""
此处的func对应的是f1的地址
@w1等同于在函数创建后 f1 = w1(f1) 然后接着就是 f1()
"""
@w1
def f1():
    print('f1')
# 在底层 f1 = w1(f1)
f1()
